package study.JavaBase;

import java.util.Scanner;

/**
 * date：2025.10.13
 * title：String
 * author:fzy
 */
public class Java_10 {
    public static void main(String[] args) {
//        ApiTest.test();
//        StringClass.createString();
        UserLogin userLogin = new UserLogin();
        userLogin.login();
    }
}

//创建字符串
//string创建的字符串存储在公共池中。new创建的对象在堆中
//栈：存储变量，用完释放
//堆：存储对象，由jvm管理里
//公共池：存储数据，当新建变量是节约内存

/**
 * string对象不可变，就像下面的str和str2，表面上str是更换了内容，实际地址没有边，str中的myfirstString还存在内存中，造成泄露
 * String的值可以共享
 * String效果相当于char[]，但是底层原理是byte[]
 */
class StringClass {
    static void createString() {
        String str = "myFirstString";
        String str2 = "mySecondString";
        str = str2;
        String str3 = new String("myFirstString");
        //无参构造方法，不含有任何内容
        String str4 = new String();
        System.out.println(str4);
        //根据字符数组构造
        char[] a = {'1', '2', '3'};
        String str5 = new String(a);
        System.out.println("字符数组构造" + str5);
        //根据字节数组构造
        byte[] b1 = {97, 98, 99};
        String str6 = new String(b1);
        System.out.println("字节数组构造" + str5);
   /*
    通过new创建字符串对象，每一次new都会申请一个内存空间，内容相同，地址值不同
    以""方式给出的字符串，只要字符序列相同，无论在程序代码中出现几次，jvm都之创建一个对象，在字符串池中维护
     */
        char[] value1 = {'a','b'};
        String ss1 = new String(value1);
        String ss2 = new String(value1);
        System.out.println("构造方法地址"+(ss2==ss1));
        String ss3  = "dddd";
        String ss4 = "dddd";
        System.out.println("直接赋值"+(ss3 == ss4));
        System.out.println("equal比较"+ss1.equals(ss2));
    }

    /*
    ==
    基本类型比较数值相同
    引用类型比较地址值是否相同
     */

    //常用方法，太多了，以后用到就记一下吧哈哈哈哈
    static void commonFun() {
        String str = "TESTStr";
        //返回字符串指定下边的字符
        str.charAt(1);
        //长度
        int lengthStr = str.length();
        //连接两个字符串
        String str2 = str.concat("    sss");
        //比较两个字符串
        int compareInt = str.compareTo(str2);
        //返回这个字符第一次出现的索引
        int a = str.indexOf("C");
        //开头校验
        boolean b1 = str.startsWith("C");
        //空校验
        boolean b2 = str.isEmpty();
    }
}

class ApiTest {
    static void test() {
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        System.out.println("您输入的数字为" + i);
    }
}

//案例用户登录
//递归,这里建议使用循环，不然次数过多会导致栈溢出
class UserLogin{
    private String account = "fuzhiyu";
    private String password = "123456";
    private int loginNum = 3;

    public void login(){
        Scanner scanner  = new Scanner(System.in);
        System.out.println("请输入用户名和密码，回车确认,剩余次数"+this.loginNum);
        String account = scanner.next();
        String password = scanner.next();
        if(this.account.equals(account)&&this.password.equals(password)){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
            this.loginNum--;
            if(this.loginNum>0){
                this.login();
            }
        }
    }
}

